////////////////////////////////////////////////////////////////////////////////
//
//  FLEX USER GROUP HOKURIKU
//  Copyright 2009 Flex User Group Hokuriku
//  All Rights Reserved.
// 
//  NOTICE: Flex User Group Hokuriku permits you to use, 
//  modify, and distribute this file 
//  in accordance with the terms of the license agreement accompanying it.
//
////////////////////////////////////////////////////////////////////////////////
package net.fxug.hokuriku.chocolat.service
{
    import flash.errors.IllegalOperationError;

    /**
     * Twitter検索間隔を算出するために用いられる。.
     */
    public class TweetSearchSpanResolver
    {
        /** １分を表すミリ秒 */
        private static const MINUTE_OF_TIME:int = 1000 * 60;
        private static const MINUTE_OF_HOUR:int = MINUTE_OF_TIME * 60;
        private static const PARSENTAGE:int = 100;
        /** デフォルト検索時間(とりあえず1分に設定) */
        public static const DEFAULT_DELAY:int = MINUTE_OF_TIME;
        /**
         * 最も短いレスポンスタイムの上限(1分)。
         * この間隔よりも早い時間でリクエストが投げられる事はない。
         */
        private static const MAX_FASTER_TIME:int = MINUTE_OF_TIME;
        /**
         * 最も長いレスポンスタイムの下限(3分)。
         * この間隔よりも長い時間でリクエストが投げられる事はない。
         */
        private static const MAX_LATE_TIME:int = MINUTE_OF_TIME * 3;

        /** セッション時間 */
        private var sessionBaseTime:int;


        /**
         * コンストラクタ
         * @param standardTime ServerModeで設定されるセッション時間。
         */
        public function TweetSearchSpanResolver(sessionBaseTime:int)
        {
            this.sessionBaseTime = sessionBaseTime;
        }

        /**
         * 次の待機時間を返す。
         * 検索間隔をミリ秒単位で返す。
         */
        [Deprecated("このメソッドは暫定実装になっており、10分以内であれば30秒を、それを超える場合は1分を返します。")]
        public function findWatingTime():int
        {
            // FIXME 実装。とりあえず1分を返す実装。
            if (this.sessionBaseTime <= 1000 * 60 * 10)
            {
                return 1000 * 30;
            }
            return 1000 * 60;
//            var base:int = this.findBaseTime();
//
//            //TODO 呟きが0件を考慮していない
//            // 各係数から、間隔を算出する。
//            //var rate:int = this.findTweetCount() * 0.5 + this.findRemainderTime() * 0.25 + this.hiddenParameter() * 0.25
//            var rate:int = 0;
//            return base * rate;
        }

        /**
         * セッション時間から基準時間を算出する(1分から３分)。
         * 10分を底値として、短ければ短いほど、長ければ長いほどレスポンスが早くなる。
         * 60分を超える場合は60分と同じレスポンスタイムとなる。
         * y:レスポンスタイム
         * x:セッション時間
         * y = (2s * x + 1s) / 7 ---> (3s <= x <= 10s)
         * y = (-x + 85s) / 25s  ---> (10s <= x <= 60s)
         * y = 180s ----------------> (60s < x)
         *
         * @param sessionTime セッション時間を表すミリ秒(1000 * 60 < sessionTime)
         */
        public function findBaseTime():int
        {
            if (sessionBaseTime == MINUTE_OF_TIME) //1m
            {
                throw new IllegalOperationError("1分以上の値を設定してください");
            }
            var ret:int = 0;

            // 10分以内
            if (sessionBaseTime <= MINUTE_OF_TIME * 10) //10m
            {
                ret = (2000 * sessionBaseTime + 1000) / 7000;
            }
            else if (sessionBaseTime <= MINUTE_OF_HOUR) //1h
            {
                ret = (-sessionBaseTime + 85000) / 25000;
            }
            else
            {
                ret = MINUTE_OF_TIME // 1m
            }

            return ret;
        }

        /**
         * 検索結果のつぶやき件数から比率係数を算出する。
         * 算出方法は単純につぶやき件数が最大の100件の場合に1.0を返す。
         * つぶやきが0の場合はマイナス-1を返す。
         */
        public function findTweetCountRate(tweets:int):int
        {
            if (tweets <= 0)
            {
                return -1;
            }
            return tweets / PARSENTAGE;
        }


        /**
         * 係数2(セッションの残り時間)
         * まずデフォルト時間から50%ラインを100％要求として１次関数を作成する。
         *
         * 仮に100%ラインで、75%リクエスト間隔に縮まるとする。
         * つまり、デフォルト時間が3分、セッション標準時間が30分とすると、
         * 50%、15分経過した時点(実際は変動幅を推測する必要がある)でレスポンスタイムは
         * デフォルト値(3) * 1が与えられる。
         *
         * この法則に則れは、起動時のレスポンスタイムは3 * 1.25、
         * 最終のレスポンスタイムは3 * 0.75となる。
         *
         * 但し最終レスポンスタイムが30秒を下回ることはない。
         * 今の変動している全体時間にしめる経過時間の割合を算出し、その%から先ほど作成した一次関数と突合せ係数情報を得る
         *
         * @param elapsedTime 経過時間
         * @param baseNowTime 現在の総時間
         */
        public function findRemainderTime(elapsedTime:int, baseNowTime:int):int
        {
            // セッションの設定時間を超えている場合は、常に最高比率1.25を返す
            if (elapsedTime >= this.sessionBaseTime)
            {
                return 1.25;
            }
            // まずセッションの設定時間から全体の処理率を割り出す。
            var rate:int = elapsedTime / this.sessionBaseTime;


            // 中間値(0.5)を超えている場合は




            return 0;
        }
    }
}

internal class Rate
{
    private static const tweet:String = "";
}